#include "GnssTau1202Module.h"

#include <string.h>
#include <stdlib.h>

#include <cjson.h>

const char* gnss_header = "$GNGGA";
// 经度
char gnss_x[14][16];
uint8_t gnss_index;
char gnss_latitude[16];
char gnss_latitude_type[8];
char gnss_longitude[16];
char gnss_longitude_type[8];
char gnss_high[16];
char gnss_high_unit[8];

void Init_Gnss(void) {
	{ // 初始化邮箱
		rt_mq_init(&gnss_usart_msq,
             "finsh_usart_msg",
             &gnss_usart_msq_pool[0],      /* 内存池指向 msg_pool */
             1536,              /* 每个消息的大小是 1 字节 */
             sizeof(gnss_usart_msq_pool),  /* 内存池的大小是 msg_pool 的大小 */
             RT_IPC_FLAG_PRIO); /* 如果有多个线程等待，优先级大小的方法分配消息 */
	} // 初始化邮箱
	
	// 引脚根据实际修改。这里是北斗模块复位引脚PRRSTX控制
	// 复位低电平有效
	// 引脚初始化应初始化为高电平，防止过早复位
	// 拉低50ms复位，然后重新拉高开始工作
	GPIO_ResetPins(GPS_RST_PORT, GPS_RST_PIN);
	rt_thread_mdelay(50);
	GPIO_SetPins(GPS_RST_PORT, GPS_RST_PIN);
	
	SWDT_FeedDog();
}

// 北斗定位模块任务
char* header_token;
bool get_gnss;
int gnss_ok;
void Thread_Gnss_Task(void *parmameter){
	Init_Gnss();
	// 接收数据
	for(;;){
		get_gnss = false;
		gnss_index = 0;
		gnss_ok = 0;
		
		if (rt_mq_recv(&gnss_usart_msq, gnss_usart_msq_rx_buf, sizeof(gnss_usart_msq_rx_buf), RT_WAITING_FOREVER) > 0) {
      GPIO_SetPins(LED_ERR_PORT, LED_ERR_PIN);
    }
		
		
		//rt_kprintf(gnss_usart_msq_rx_buf);
			
		// strtok可以分割字符串，但是由于在原字符串上操作的，所以会破坏原字符串
		header_token = strtok(gnss_usart_msq_rx_buf, "\n");
		while (header_token != NULL) {
			// 检查是否有需要的字符串
			if (strstr(header_token, gnss_header)){
				get_gnss = true;
				
				// 开始提取坐标信息
				header_token = strtok(header_token, ",");
				// 根据本模块消息。这里应该是固定的14条。算上GNGGA
				//$GNGGA,092938.000,3903.76326,N,11703.05016,E,1,07,3.87,24.1,M,-5.9,M,,*5F
				while (header_token != NULL) {
					memset(gnss_x[gnss_index], 0, 16);
					strcpy(gnss_x[gnss_index], header_token);
					gnss_index++;
					
					header_token = strtok(NULL, ",");
					SWDT_FeedDog();
				}
				// 开始提取坐标信息
				
				break;
			} // 检查是否有需要的字符串
			header_token = strtok(NULL, "\n");
			SWDT_FeedDog();
		}
		
		if (!get_gnss){
			rt_kprintf("cannot found gnss data!\n");
		}else{
			for (int index=0; index<14; index++){
				//rt_kprintf("str: %s\n", gnss_x[index]);
				
				SWDT_FeedDog();
				rt_thread_mdelay(1);
			}
			
			gnss_ok = atoi(gnss_x[6]);
			/**
			* 0 无效
			* 1 单点定位
			* 2 差分定位
			* 3 PPS无效
			* 4 固定解
			* 5 浮点解
			* 6 定位中
			* 7 人工输入值
			* 8 模拟模式
			* 9 WAAS差分
			* 除了0/1/6/7。都不知道啥意思。正常就是0和1
			*/
			if (gnss_ok == 1 || gnss_ok == 2){
				strcpy(gnss_latitude, gnss_x[2]);
				strcpy(gnss_latitude_type, gnss_x[3]);
				strcpy(gnss_longitude, gnss_x[4]);
				strcpy(gnss_longitude_type, gnss_x[5]);
				strcpy(gnss_high, gnss_x[9]);
				strcpy(gnss_high_unit, gnss_x[10]);
				
				cJSON* root = cJSON_CreateObject();
				cJSON_AddStringToObject(root, "gnss latitude", gnss_latitude);
				cJSON_AddStringToObject(root, "gnss latitude type", gnss_latitude_type);
				cJSON_AddStringToObject(root, "gnss longitude",  gnss_longitude);
				cJSON_AddStringToObject(root, "gnss longitude type", gnss_longitude_type);
				cJSON_AddStringToObject(root, "gnss hign", gnss_high);
				cJSON_AddStringToObject(root, "gnss hign unit", gnss_high_unit);
				char* jsonString = cJSON_Print(root);
				rt_kprintf("gnss data: \n%s\n", jsonString);
				// 释放内存
				cJSON_Delete(root);
				free(jsonString);
				
//				rt_kprintf("gnss latitude: %s\n", gnss_latitude);
//				rt_kprintf("gnss latitude type: %s\n", gnss_latitude_type);
//				rt_kprintf("gnss longitude: %s\n", gnss_longitude);
//				rt_kprintf("gnss longitude type: %s\n", gnss_longitude_type);
//				rt_kprintf("gnss hign: %s\n", gnss_high);
//				rt_kprintf("gnss hign unit: %s\n", gnss_high_unit);
			} else {
				;
				//rt_kprintf("unavaliabled gnss data!\n");
			}
		}
		
		SWDT_FeedDog();
	}
	
}
